<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>URP综合教务系统 - 登录</title>
		<script src="/dwr/interface/ajaxtool.js" type="text/javascript">
			// Provide a default path to dwr.engine
			if (dwr == null) var dwr = {};
			if (dwr.engine == null) dwr.engine = {};
			if (DWREngine == null) var DWREngine = dwr.engine;

			if (ajaxtool == null) var ajaxtool = {};
			ajaxtool._path = '/dwr';
			ajaxtool.getMessage = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getMessage', callback);
			}
			ajaxtool.getType = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getType', false, callback);
			}
			ajaxtool.getOper = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getOper', p0, callback);
			}
			ajaxtool.getJas = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getJas', p0, p1, callback);
			}
			ajaxtool.getJxl = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getJxl', p0, callback);
			}
			ajaxtool.getTjzt = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getTjzt', callback);
			}
			ajaxtool.reCall = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'reCall', callback);
			}
			ajaxtool.getLwJsh = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getLwJsh', p0, callback);
			}
			ajaxtool.getLwDykc = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getLwDykc', p0, p1, callback);
			}
			ajaxtool.getZybList = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getZybList', p0, p1, callback);
			}
			ajaxtool.getZybInfo = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getZybInfo', p0, callback);
			}
			ajaxtool.getZybInfoNotnull = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getZybInfoNotnull', p0, callback);
			}
			ajaxtool.getBjInfo = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getBjInfo', p0, p1, callback);
			}
			ajaxtool.getTmxx = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getTmxx', p0, p1, callback);
			}
			ajaxtool.checkEmail = function(p0, p1, p2, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'checkEmail', p0, p1, p2, callback);
			}
			ajaxtool.getXsbInfo = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getXsbInfo', callback);
			}
			ajaxtool.getXsbInfoNotnull = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getXsbInfoNotnull', callback);
			}
			ajaxtool.getZyfxbInfo = function(p0, p1, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getZyfxbInfo', p0, p1, callback);
			}
			ajaxtool.getDownFile = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getDownFile', callback);
			}
			ajaxtool.getBjInfoNew = function(p0, p1, p2, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getBjInfoNew', p0, p1, p2, callback);
			}
			ajaxtool.getJYSNew = function(p0, callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getJYSNew', p0, callback);
			}
			ajaxtool.getMaterialAll1 = function(callback) {
				dwr.engine._execute(ajaxtool._path, 'ajaxtool', 'getMaterialAll1', callback);
			}
		</script>
		<script src="/dwr/engine.js" type="text/javascript">
			if (DWREngine == null) var DWREngine = {};

			DWREngine.setErrorHandler = function(handler) {
				DWREngine._errorHandler = handler;
			};

			DWREngine.setWarningHandler = function(handler) {
				DWREngine._warningHandler = handler;
			};

			DWREngine.setTimeout = function(timeout) {
				DWREngine._timeout = timeout;
			};

			DWREngine.setPreHook = function(handler) {
				DWREngine._preHook = handler;
			};

			DWREngine.setPostHook = function(handler) {
				DWREngine._postHook = handler;
			};

			DWREngine.XMLHttpRequest = 1;

			DWREngine.IFrame = 2;

			DWREngine.setMethod = function(newMethod) {
				if (newMethod != DWREngine.XMLHttpRequest && newMethod != DWREngine.IFrame) {
					DWREngine._handleError("Remoting method must be one of DWREngine.XMLHttpRequest or DWREngine.IFrame");
					return;
				}
				DWREngine._method = newMethod;
			};

			DWREngine.setVerb = function(verb) {
				if (verb != "GET" && verb != "POST") {
					DWREngine._handleError("Remoting verb must be one of GET or POST");
					return;
				}
				DWREngine._verb = verb;
			};

			DWREngine.setOrdered = function(ordered) {
				DWREngine._ordered = ordered;
			};

			DWREngine.setAsync = function(async) {
				DWREngine._async = async;
			};

			DWREngine.setTextHtmlHandler = function(handler) {
				DWREngine._textHtmlHandler = handler;
			}

			DWREngine.defaultMessageHandler = function(message) {
				if (typeof message == "object" && message.name == "Error" && message.description) {
					alert("Error: " + message.description);
				} else {

					if (message.toString().indexOf("0x80040111") == -1) {
						alert(message);
					}
				}
			};

			DWREngine.beginBatch = function() {
				if (DWREngine._batch) {
					DWREngine._handleError("Batch already started.");
					return;
				}

				DWREngine._batch = {
					map: {
						callCount: 0
					},
					paramCount: 0,
					ids: [],
					preHooks: [],
					postHooks: []
				};
			};

			DWREngine.endBatch = function(options) {
				var batch = DWREngine._batch;
				if (batch == null) {
					DWREngine._handleError("No batch in progress.");
					return;
				}

				if (options && options.preHook) batch.preHooks.unshift(options.preHook);
				if (options && options.postHook) batch.postHooks.push(options.postHook);
				if (DWREngine._preHook) batch.preHooks.unshift(DWREngine._preHook);
				if (DWREngine._postHook) batch.postHooks.push(DWREngine._postHook);

				if (batch.method == null) batch.method = DWREngine._method;
				if (batch.verb == null) batch.verb = DWREngine._verb;
				if (batch.async == null) batch.async = DWREngine._async;
				if (batch.timeout == null) batch.timeout = DWREngine._timeout;

				batch.completed = false;

				DWREngine._batch = null;

				if (!DWREngine._ordered) {
					DWREngine._sendData(batch);
					DWREngine._batches[DWREngine._batches.length] = batch;
				} else {
					if (DWREngine._batches.length == 0) {

						DWREngine._sendData(batch);
						DWREngine._batches[DWREngine._batches.length] = batch;
					} else {

						DWREngine._batchQueue[DWREngine._batchQueue.length] = batch;
					}
				}
			};

			DWREngine._errorHandler = DWREngine.defaultMessageHandler;

			DWREngine._warningHandler = null;

			DWREngine._preHook = null;

			DWREngine._postHook = null;

			DWREngine._batches = [];

			DWREngine._batchQueue = [];

			DWREngine._handlersMap = {};

			DWREngine._method = DWREngine.XMLHttpRequest;

			DWREngine._verb = "POST";

			DWREngine._ordered = false;

			DWREngine._async = true;

			DWREngine._batch = null;

			DWREngine._timeout = 0;

			DWREngine._DOMDocument = ["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];

			DWREngine._XMLHTTP = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];

			DWREngine._execute = function(path, scriptName, methodName, vararg_params) {
				var singleShot = false;
				if (DWREngine._batch == null) {
					DWREngine.beginBatch();
					singleShot = true;
				}

				var args = [];
				for (var i = 0; i < arguments.length - 3; i++) {
					args[i] = arguments[i + 3];
				}

				if (DWREngine._batch.path == null) {
					DWREngine._batch.path = path;
				} else {
					if (DWREngine._batch.path != path) {
						DWREngine._handleError("Can't batch requests to multiple DWR Servlets.");
						return;
					}
				}

				var params;
				var callData;
				var firstArg = args[0];
				var lastArg = args[args.length - 1];

				if (typeof firstArg == "function") {
					callData = {
						callback: args.shift()
					};
					params = args;
				} else if (typeof lastArg == "function") {
					callData = {
						callback: args.pop()
					};
					params = args;
				} else if (lastArg != null && typeof lastArg == "object" && lastArg.callback != null && typeof lastArg.callback == "function") {
					callData = args.pop();
					params = args;
				} else if (firstArg == null) {

					if (lastArg == null && args.length > 2) {
						DWREngine._handleError("Ambiguous nulls at start and end of parameter list. Which is the callback function?");
					}
					callData = {
						callback: args.shift()
					};
					params = args;
				} else if (lastArg == null) {
					callData = {
						callback: args.pop()
					};
					params = args;
				} else {
					DWREngine._handleError("Missing callback function or metadata object.");
					return;
				}

				var random = Math.floor(Math.random() * 10001);
				var id = (random + "_" + new Date().getTime()).toString();
				var prefix = "c" + DWREngine._batch.map.callCount + "-";
				DWREngine._batch.ids.push(id);

				if (callData.method != null) {
					DWREngine._batch.method = callData.method;
					delete callData.method;
				}
				if (callData.verb != null) {
					DWREngine._batch.verb = callData.verb;
					delete callData.verb;
				}
				if (callData.async != null) {
					DWREngine._batch.async = callData.async;
					delete callData.async;
				}
				if (callData.timeout != null) {
					DWREngine._batch.timeout = callData.timeout;
					delete callData.timeout;
				}

				if (callData.preHook != null) {
					DWREngine._batch.preHooks.unshift(callData.preHook);
					delete callData.preHook;
				}
				if (callData.postHook != null) {
					DWREngine._batch.postHooks.push(callData.postHook);
					delete callData.postHook;
				}

				if (callData.errorHandler == null) callData.errorHandler = DWREngine._errorHandler;
				if (callData.warningHandler == null) callData.warningHandler = DWREngine._warningHandler;

				DWREngine._handlersMap[id] = callData;

				DWREngine._batch.map[prefix + "scriptName"] = scriptName;
				DWREngine._batch.map[prefix + "methodName"] = methodName;
				DWREngine._batch.map[prefix + "id"] = id;

				for (i = 0; i < params.length; i++) {
					DWREngine._serializeAll(DWREngine._batch, [], params[i], prefix + "param" + i);
				}

				DWREngine._batch.map.callCount++;
				if (singleShot) {
					DWREngine.endBatch();
				}
			};

			DWREngine._sendData = function(batch) {

				if (batch.map.callCount == 0) return;

				for (var i = 0; i < batch.preHooks.length; i++) {
					batch.preHooks[i]();
				}
				batch.preHooks = null;

				if (batch.timeout && batch.timeout != 0) {
					batch.interval = setInterval(function() {
						DWREngine._abortRequest(batch);
					}, batch.timeout);
				}

				var urlPostfix;
				if (batch.map.callCount == 1) {
					urlPostfix = batch.map["c0-scriptName"] + "." + batch.map["c0-methodName"] + ".dwr";
				} else {
					urlPostfix = "Multiple." + batch.map.callCount + ".dwr";
				}

				if (batch.method == DWREngine.XMLHttpRequest) {
					if (window.XMLHttpRequest) {
						batch.req = new XMLHttpRequest();
					} else if (window.ActiveXObject && !(navigator.userAgent.indexOf("Mac") >= 0 && navigator.userAgent.indexOf("MSIE") >= 0)) {
						batch.req = DWREngine._newActiveXObject(DWREngine._XMLHTTP);
					}
				}

				var query = "";
				var prop;

				if (batch.req) {
					batch.map.xml = "true";

					if (batch.async) {
						batch.req.onreadystatechange = function() {
							DWREngine._stateChange(batch);
						};
					}

					var indexSafari = navigator.userAgent.indexOf("Safari/");
					if (indexSafari >= 0) {
						var version = navigator.userAgent.substring(indexSafari + 7);
						if (parseInt(version, 10) < 400) batch.verb == "GET";
					}
					if (batch.verb == "GET") {

						batch.map.callCount = "" + batch.map.callCount;

						for (prop in batch.map) {
							var qkey = encodeURIComponent(prop);
							var qval = encodeURIComponent(batch.map[prop]);
							if (qval == "") DWREngine._handleError("Found empty qval for qkey=" + qkey);
							query += qkey + "=" + qval + "&";
						}

						try {
							batch.req.open("GET", batch.path + "/exec/" + urlPostfix + "?" + query, batch.async);
							batch.req.send(null);
							if (!batch.async) DWREngine._stateChange(batch);
						} catch (ex) {
							DWREngine._handleMetaDataError(null, ex);
						}
					} else {
						for (prop in batch.map) {
							if (typeof batch.map[prop] != "function") {
								query += prop + "=" + batch.map[prop] + "\n";
							}
						}

						try {
							batch.req.open("POST", batch.path + "/exec/" + urlPostfix, batch.async);
							batch.req.setRequestHeader('Content-Type', 'text/plain');
							batch.req.send(query);
							if (!batch.async) DWREngine._stateChange(batch);
						} catch (ex) {
							DWREngine._handleMetaDataError(null, ex);
						}
					}
				} else {
					batch.map.xml = "false";
					var idname = "dwr-if-" + batch.map["c0-id"];

					batch.div = document.createElement("div");
					batch.div.innerHTML = "<iframe src='javascript:void(0)' frameborder='0' width='0' height='0' id='" + idname + "' name='" + idname + "'></iframe>";
					document.body.appendChild(batch.div);
					batch.iframe = document.getElementById(idname);
					batch.iframe.setAttribute("style", "width:0px; height:0px; border:0px;");

					if (batch.verb == "GET") {
						for (prop in batch.map) {
							if (typeof batch.map[prop] != "function") {
								query += encodeURIComponent(prop) + "=" + encodeURIComponent(batch.map[prop]) + "&";
							}
						}
						query = query.substring(0, query.length - 1);

						batch.iframe.setAttribute("src", batch.path + "/exec/" + urlPostfix + "?" + query);
						document.body.appendChild(batch.iframe);
					} else {
						batch.form = document.createElement("form");
						batch.form.setAttribute("id", "dwr-form");
						batch.form.setAttribute("action", batch.path + "/exec" + urlPostfix);
						batch.form.setAttribute("target", idname);
						batch.form.target = idname;
						batch.form.setAttribute("method", "POST");
						for (prop in batch.map) {
							var formInput = document.createElement("input");
							formInput.setAttribute("type", "hidden");
							formInput.setAttribute("name", prop);
							formInput.setAttribute("value", batch.map[prop]);
							batch.form.appendChild(formInput);
						}
						document.body.appendChild(batch.form);
						batch.form.submit();
					}
				}
			};

			DWREngine._stateChange = function(batch) {
				if (!batch.completed && batch.req.readyState == 4) {
					try {
						var reply = batch.req.responseText;

						if (reply == null || reply == "") {
							DWREngine._handleMetaDataWarning(null, "No data received from server");
						} else {
							var contentType = batch.req.getResponseHeader("Content-Type");
							if (!contentType.match(/^text\/plain/) && !contentType.match(/^text\/javascript/)) {
								if (DWREngine._textHtmlHandler && contentType.match(/^text\/html/)) {
									DWREngine._textHtmlHandler();
								} else {
									DWREngine._handleMetaDataWarning(null, "Invalid content type from server: '" + contentType + "'");
								}
							} else {

								if (reply.search("DWREngine._handle") == -1) {
									DWREngine._handleMetaDataWarning(null, "Invalid reply from server");
								} else {
									eval(reply);
								}
							}
						}

						DWREngine._clearUp(batch);
					} catch (ex) {
						if (ex == null) ex = "Unknown error occured";
						DWREngine._handleMetaDataWarning(null, ex);
					} finally {

						if (DWREngine._batchQueue.length != 0) {
							var sendbatch = DWREngine._batchQueue.shift();
							DWREngine._sendData(sendbatch);
							DWREngine._batches[DWREngine._batches.length] = sendbatch;
						}
					}
				}
			};

			DWREngine._handleResponse = function(id, reply) {

				var handlers = DWREngine._handlersMap[id];
				DWREngine._handlersMap[id] = null;

				if (handlers) {

					try {
						if (handlers.callback) handlers.callback(reply);
					} catch (ex) {
						DWREngine._handleMetaDataError(handlers, ex);
					}
				}

				if (DWREngine._method == DWREngine.IFrame) {
					var responseBatch = DWREngine._batches[DWREngine._batches.length - 1];

					if (responseBatch.map["c" + (responseBatch.map.callCount - 1) + "-id"] == id) {
						DWREngine._clearUp(responseBatch);
					}
				}
			};

			DWREngine._handleServerError = function(id, error) {

				var handlers = DWREngine._handlersMap[id];
				DWREngine._handlersMap[id] = null;

				if (error.message) DWREngine._handleMetaDataError(handlers, error.message, error);
				else DWREngine._handleMetaDataError(handlers, error);
			};

			DWREngine._eval = function(script) {
				return eval(script);
			}

			DWREngine._abortRequest = function(batch) {
				if (batch && !batch.completed) {
					clearInterval(batch.interval);
					DWREngine._clearUp(batch);
					if (batch.req) batch.req.abort();

					var handlers;
					for (var i = 0; i < batch.ids.length; i++) {
						handlers = DWREngine._handlersMap[batch.ids[i]];
						DWREngine._handleMetaDataError(handlers, "Timeout");
					}
				}
			};

			DWREngine._clearUp = function(batch) {
				if (batch.completed) {
					DWREngine._handleError("Double complete");
					return;
				}

				if (batch.div) batch.div.parentNode.removeChild(batch.div);
				if (batch.iframe) batch.iframe.parentNode.removeChild(batch.iframe);
				if (batch.form) batch.form.parentNode.removeChild(batch.form);

				if (batch.req) delete batch.req;

				for (var i = 0; i < batch.postHooks.length; i++) {
					batch.postHooks[i]();
				}
				batch.postHooks = null;

				for (var i = 0; i < DWREngine._batches.length; i++) {
					if (DWREngine._batches[i] == batch) {
						DWREngine._batches.splice(i, 1);
						break;
					}
				}

				batch.completed = true;
			};

			DWREngine._handleError = function(reason, ex) {
				if (DWREngine._errorHandler) DWREngine._errorHandler(reason, ex);
			};

			DWREngine._handleWarning = function(reason, ex) {
				if (DWREngine._warningHandler) DWREngine._warningHandler(reason, ex);
			};

			DWREngine._handleMetaDataError = function(handlers, reason, ex) {
				if (handlers && typeof handlers.errorHandler == "function") handlers.errorHandler(reason, ex);
				else DWREngine._handleError(reason, ex);
			};

			DWREngine._handleMetaDataWarning = function(handlers, reason, ex) {
				if (handlers && typeof handlers.warningHandler == "function") handlers.warningHandler(reason, ex);
				else DWREngine._handleWarning(reason, ex);
			};

			DWREngine._serializeAll = function(batch, referto, data, name) {
				if (data == null) {
					batch.map[name] = "null:null";
					return;
				}

				switch (typeof data) {
					case "boolean":
						batch.map[name] = "boolean:" + data;
						break;
					case "number":
						batch.map[name] = "number:" + data;
						break;
					case "string":
						batch.map[name] = "string:" + encodeURIComponent(data);
						break;
					case "object":
						if (data instanceof String) batch.map[name] = "String:" + encodeURIComponent(data);
						else if (data instanceof Boolean) batch.map[name] = "Boolean:" + data;
						else if (data instanceof Number) batch.map[name] = "Number:" + data;
						else if (data instanceof Date) batch.map[name] = "Date:" + data.getTime();
						else if (data instanceof Array) batch.map[name] = DWREngine._serializeArray(batch, referto, data, name);
						else batch.map[name] = DWREngine._serializeObject(batch, referto, data, name);
						break;
					case "function":

						break;
					default:
						DWREngine._handleWarning("Unexpected type: " + typeof data + ", attempting default converter.");
						batch.map[name] = "default:" + data;
						break;
				}
			};

			DWREngine._lookup = function(referto, data, name) {
				var lookup;

				for (var i = 0; i < referto.length; i++) {
					if (referto[i].data == data) {
						lookup = referto[i];
						break;
					}
				}
				if (lookup) return "reference:" + lookup.name;
				referto.push({
					data: data,
					name: name
				});
				return null;
			};

			DWREngine._serializeObject = function(batch, referto, data, name) {
				var ref = DWREngine._lookup(referto, data, name);
				if (ref) return ref;

				if (data.nodeName && data.nodeType) {
					return DWREngine._serializeXml(batch, referto, data, name);
				}

				var reply = "Object:{";
				var element;
				for (element in data) {
					batch.paramCount++;
					var childName = "c" + DWREngine._batch.map.callCount + "-e" + batch.paramCount;
					DWREngine._serializeAll(batch, referto, data[element], childName);

					reply += encodeURIComponent(element) + ":reference:" + childName + ", ";
				}

				if (reply.substring(reply.length - 2) == ", ") {
					reply = reply.substring(0, reply.length - 2);
				}
				reply += "}";

				return reply;
			};

			DWREngine._serializeXml = function(batch, referto, data, name) {
				var ref = DWREngine._lookup(referto, data, name);
				if (ref) return ref;

				var output;
				if (window.XMLSerializer) output = new XMLSerializer().serializeToString(data);
				else output = data.toXml;

				return "XML:" + encodeURIComponent(output);
			};

			DWREngine._serializeArray = function(batch, referto, data, name) {
				var ref = DWREngine._lookup(referto, data, name);
				if (ref) return ref;

				var reply = "Array:[";
				for (var i = 0; i < data.length; i++) {
					if (i != 0) reply += ",";
					batch.paramCount++;
					var childName = "c" + DWREngine._batch.map.callCount + "-e" + batch.paramCount;
					DWREngine._serializeAll(batch, referto, data[i], childName);
					reply += "reference:";
					reply += childName;
				}
				reply += "]";

				return reply;
			};

			DWREngine._unserializeDocument = function(xml) {
				var dom;
				if (window.DOMParser) {
					var parser = new DOMParser();
					dom = parser.parseFromString(xml, "text/xml");
					if (!dom.documentElement || dom.documentElement.tagName == "parsererror") {
						var message = dom.documentElement.firstChild.data;
						message += "\n" + dom.documentElement.firstChild.nextSibling.firstChild.data;
						throw message;
					}
					return dom;
				} else if (window.ActiveXObject) {
					dom = DWREngine._newActiveXObject(DWREngine._DOMDocument);
					dom.loadXML(xml);
					return dom;
				} else {
					var div = document.createElement("div");
					div.innerHTML = xml;
					return div;
				}
			};

			DWREngine._newActiveXObject = function(axarray) {
				var returnValue;
				for (var i = 0; i < axarray.length; i++) {
					try {
						returnValue = new ActiveXObject(axarray[i]);
						break;
					} catch (ex) {}
				}
				return returnValue;
			};

			if (typeof window.encodeURIComponent === 'undefined') {
				DWREngine._utf8 = function(wide) {
					wide = "" + wide;
					var c;
					var s;
					var enc = "";
					var i = 0;
					while (i < wide.length) {
						c = wide.charCodeAt(i++);

						if (c >= 0xDC00 && c < 0xE000) continue;
						if (c >= 0xD800 && c < 0xDC00) {
							if (i >= wide.length) continue;
							s = wide.charCodeAt(i++);
							if (s < 0xDC00 || c >= 0xDE00) continue;
							c = ((c - 0xD800) << 10) + (s - 0xDC00) + 0x10000;
						}

						if (c < 0x80) {
							enc += String.fromCharCode(c);
						} else if (c < 0x800) {
							enc += String.fromCharCode(0xC0 + (c >> 6), 0x80 + (c & 0x3F));
						} else if (c < 0x10000) {
							enc += String.fromCharCode(0xE0 + (c >> 12), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
						} else {
							enc += String.fromCharCode(0xF0 + (c >> 18), 0x80 + (c >> 12 & 0x3F), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
						}
					}
					return enc;
				}

				DWREngine._hexchars = "0123456789ABCDEF";

				DWREngine._toHex = function(n) {
					return DWREngine._hexchars.charAt(n >> 4) + DWREngine._hexchars.charAt(n & 0xF);
				}

				DWREngine._okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";

				window.encodeURIComponent = function(s) {
					s = DWREngine._utf8(s);
					var c;
					var enc = "";
					for (var i = 0; i < s.length; i++) {
						if (DWREngine._okURIchars.indexOf(s.charAt(i)) == -1) {
							enc += "%" + DWREngine._toHex(s.charCodeAt(i));
						} else {
							enc += s.charAt(i);
						}
					}
					return enc;
				}
			}

			if (typeof Array.prototype.splice === 'undefined') {
				Array.prototype.splice = function(ind, cnt) {
					if (arguments.length == 0) return ind;
					if (typeof ind != "number") ind = 0;
					if (ind < 0) ind = Math.max(0, this.length + ind);
					if (ind > this.length) {
						if (arguments.length > 2) ind = this.length;
						else return [];
					}
					if (arguments.length < 2) cnt = this.length - ind;

					cnt = (typeof cnt == "number") ? Math.max(0, cnt) : 0;
					removeArray = this.slice(ind, ind + cnt);
					endArray = this.slice(ind + cnt);
					this.length = ind;

					for (var i = 2; i < arguments.length; i++) this[this.length] = arguments[i];
					for (i = 0; i < endArray.length; i++) this[this.length] = endArray[i];

					return removeArray;
				}
			}

			if (typeof Array.prototype.shift === 'undefined') {
				Array.prototype.shift = function(str) {
					var val = this[0];
					for (var i = 1; i < this.length; ++i) this[i - 1] = this[i];
					this.length--;
					return val;
				}
			}

			if (typeof Array.prototype.unshift === 'undefined') {
				Array.prototype.unshift = function() {
					var i = unshift.arguments.length;
					for (var j = this.length - 1; j >= 0; --j) this[j + i] = this[j];
					for (j = 0; j < i; ++j) this[j] = unshift.arguments[j];
				}
			}

			if (typeof Array.prototype.push === 'undefined') {
				Array.prototype.push = function() {
					var sub = this.length;
					for (var i = 0; i < push.arguments.length; ++i) {
						this[sub] = push.arguments[i];
						sub++;
					}
				}
			}

			if (typeof Array.prototype.pop === 'undefined') {
				Array.prototype.pop = function() {
					var lastElement = this[this.length - 1];
					this.length--;
					return lastElement;
				}
			}
		</script>
		<script src="/dwr/util.js" type="text/javascript">
			/*
			 * Copyright 2005 Joe Walker
			 *
			 * Licensed under the Apache License, Version 2.0 (the "License");
			 * you may not use this file except in compliance with the License.
			 * You may obtain a copy of the License at
			 *
			 *     http://www.apache.org/licenses/LICENSE-2.0
			 *
			 * Unless required by applicable law or agreed to in writing, software
			 * distributed under the License is distributed on an "AS IS" BASIS,
			 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
			 * See the License for the specific language governing permissions and
			 * limitations under the License.
			 */

			/**
			 * Declare an object to which we can add real functions.
			 */
			if (dwr == null) var dwr = {};
			if (dwr.util == null) dwr.util = {};
			if (DWRUtil == null) var DWRUtil = dwr.util;

			/** @private The flag we use to decide if we should escape html */
			dwr.util._escapeHtml = true;

			/**
			 * Set the global escapeHtml flag
			 */
			dwr.util.setEscapeHtml = function(escapeHtml) {
				dwr.util._escapeHtml = escapeHtml;
			};

			/** @private Work out from an options list and global settings if we should be esccaping */
			dwr.util._shouldEscapeHtml = function(options) {
				if (options && options.escapeHtml != null) {
					return options.escapeHtml;
				}
				return dwr.util._escapeHtml;
			};

			/**
			 * Return a string with &, < and > replaced with their entities
			 * @see TODO
			 */
			dwr.util.escapeHtml = function(original) {
				return original.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
			};

			/**
			 * Replace common XML entities with characters (see dwr.util.escapeHtml())
			 * @see TODO
			 */
			dwr.util.unescapeHtml = function(original) {
				return original.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
			};

			/**
			 * Replace characters dangerous for XSS reasons with visually similar characters
			 * @see TODO
			 */
			dwr.util.replaceXmlCharacters = function(original) {
				original = original.replace("&", "+");
				original = original.replace("<", "\u2039");
				original = original.replace(">", "\u203A");
				original = original.replace("\'", "\u2018");
				original = original.replace("\"", "\u201C");
				return original;
			};

			/**
			 * Return true iff the input string contains any XSS dangerous characters
			 * @see TODO
			 */
			dwr.util.containsXssRiskyCharacters = function(original) {
				return (original.indexOf('&') != -1 || original.indexOf('<') != -1 || original.indexOf('>') != -1 || original.indexOf('\'') != -1 || original.indexOf('\"') != -1);
			};

			/**
			 * Enables you to react to return being pressed in an input
			 * @see http://getahead.org/dwr/browser/util/selectrange
			 */
			dwr.util.onReturn = function(event, action) {
				if (!event) event = window.event;
				if (event && event.keyCode && event.keyCode == 13) action();
			};

			/**
			 * Select a specific range in a text box. Useful for 'google suggest' type functions.
			 * @see http://getahead.org/dwr/browser/util/selectrange
			 */
			dwr.util.selectRange = function(ele, start, end) {
				ele = dwr.util._getElementById(ele, "selectRange()");
				if (ele == null) return;
				if (ele.setSelectionRange) {
					ele.setSelectionRange(start, end);
				} else if (ele.createTextRange) {
					var range = ele.createTextRange();
					range.moveStart("character", start);
					range.moveEnd("character", end - ele.value.length);
					range.select();
				}
				ele.focus();
			};

			/**
			 * Find the element in the current HTML document with the given id or ids
			 * @see http://getahead.org/dwr/browser/util/$
			 */
			if (document.getElementById) {
				dwr.util.byId = function() {
					var elements = new Array();
					for (var i = 0; i < arguments.length; i++) {
						var element = arguments[i];
						if (typeof element == 'string') {
							element = document.getElementById(element);
						}
						if (arguments.length == 1) {
							return element;
						}
						elements.push(element);
					}
					return elements;
				};
			} else if (document.all) {
				dwr.util.byId = function() {
					var elements = new Array();
					for (var i = 0; i < arguments.length; i++) {
						var element = arguments[i];
						if (typeof element == 'string') {
							element = document.all[element];
						}
						if (arguments.length == 1) {
							return element;
						}
						elements.push(element);
					}
					return elements;
				};
			}

			/**
			 * Alias $ to dwr.util.byId
			 * @see http://getahead.org/dwr/browser/util/$
			 */
			var $;
			if (!$) {
				$ = dwr.util.byId;
			}

			/**
			 * This function pretty-prints simple data or whole object graphs, f ex as an aid in debugging.
			 * @see http://getahead.org/dwr/browser/util/todescriptivestring
			 */
			dwr.util.toDescriptiveString = function(data, showLevels, options) {
				if (showLevels === undefined) showLevels = 1;
				var opt = {};
				if (dwr.util._isObject(options)) opt = options;
				var defaultoptions = {
					escapeHtml: false,
					baseIndent: "",
					childIndent: "\u00A0\u00A0",
					lineTerminator: "\n",
					oneLineMaxItems: 5,
					shortStringMaxLength: 13,
					propertyNameMaxLength: 30
				};
				for (var p in defaultoptions) {
					if (!(p in opt)) {
						opt[p] = defaultoptions[p];
					}
				}

				var skipDomProperties = {
					document: true,
					ownerDocument: true,
					all: true,
					parentElement: true,
					parentNode: true,
					offsetParent: true,
					children: true,
					firstChild: true,
					lastChild: true,
					previousSibling: true,
					nextSibling: true,
					innerHTML: true,
					outerHTML: true,
					innerText: true,
					outerText: true,
					textContent: true,
					attributes: true,
					style: true,
					currentStyle: true,
					runtimeStyle: true,
					parentTextEdit: true
				};

				function recursive(data, showLevels, indentDepth, options) {
					var reply = "";
					try {
						// string
						if (typeof data == "string") {
							var str = data;
							if (showLevels == 0 && str.length > options.shortStringMaxLength)
								str = str.substring(0, options.shortStringMaxLength - 3) + "...";
							if (options.escapeHtml) {
								// Do the escape separately for every line as escapeHtml() on some 
								// browsers (IE) will strip line breaks and we want to preserve them
								var lines = str.split("\n");
								for (var i = 0; i < lines.length; i++) lines[i] = dwr.util.escapeHtml(lines[i]);
								str = lines.join("\n");
							}
							if (showLevels == 0) { // Short format
								str = str.replace(/\n|\r|\t/g, function(ch) {
									switch (ch) {
										case "\n":
											return "\\n";
										case "\r":
											return "";
										case "\t":
											return "\\t";
									}
								});
							} else { // Long format
								str = str.replace(/\n|\r|\t/g, function(ch) {
									switch (ch) {
										case "\n":
											return options.lineTerminator + indent(indentDepth + 1, options);
										case "\r":
											return "";
										case "\t":
											return "\\t";
									}
								});
							}
							reply = '"' + str + '"';
						}

						// function
						else if (typeof data == "function") {
							reply = "function";
						}

						// Array
						else if (dwr.util._isArray(data)) {
							if (showLevels == 0) { // Short format (don't show items)
								if (data.length > 0)
									reply = "[...]";
								else
									reply = "[]";
							} else { // Long format (show items)
								var strarr = [];
								strarr.push("[");
								var count = 0;
								for (var i = 0; i < data.length; i++) {
									if (!(i in data)) continue;
									var itemvalue = data[i];
									if (count > 0) strarr.push(", ");
									if (showLevels == 1) { // One-line format
										if (count == options.oneLineMaxItems) {
											strarr.push("...");
											break;
										}
									} else { // Multi-line format
										strarr.push(options.lineTerminator + indent(indentDepth + 1, options));
									}
									if (i != count) {
										strarr.push(i);
										strarr.push(":");
									}
									strarr.push(recursive(itemvalue, showLevels - 1, indentDepth + 1, options));
									count++;
								}
								if (showLevels > 1) strarr.push(options.lineTerminator + indent(indentDepth, options));
								strarr.push("]");
								reply = strarr.join("");
							}
						}

						// Objects except Date
						else if (dwr.util._isObject(data) && !dwr.util._isDate(data)) {
							if (showLevels == 0) { // Short format (don't show properties)
								reply = dwr.util._detailedTypeOf(data);
							} else { // Long format (show properties)
								var strarr = [];
								if (dwr.util._detailedTypeOf(data) != "Object") {
									strarr.push(dwr.util._detailedTypeOf(data));
									if (typeof data.valueOf() != "object") {
										strarr.push(":");
										strarr.push(recursive(data.valueOf(), 1, indentDepth, options));
									}
									strarr.push(" ");
								}
								strarr.push("{");
								var isDomObject = dwr.util._isHTMLElement(data);
								var count = 0;
								for (var prop in data) {
									var propvalue = data[prop];
									if (isDomObject) {
										if (!propvalue) continue;
										if (typeof propvalue == "function") continue;
										if (skipDomProperties[prop]) continue;
										if (prop.toUpperCase() == prop) continue;
									}
									if (count > 0) strarr.push(", ");
									if (showLevels == 1) { // One-line format
										if (count == options.oneLineMaxItems) {
											strarr.push("...");
											break;
										}
									} else { // Multi-line format
										strarr.push(options.lineTerminator + indent(indentDepth + 1, options));
									}
									strarr.push(prop.length > options.propertyNameMaxLength ? prop.substring(0, options.propertyNameMaxLength - 3) + "..." : prop);
									strarr.push(":");
									strarr.push(recursive(propvalue, showLevels - 1, indentDepth + 1, options));
									count++;
								}
								if (showLevels > 1 && count > 0) strarr.push(options.lineTerminator + indent(indentDepth, options));
								strarr.push("}");
								reply = strarr.join("");
							}
						}

						// undefined, null, number, boolean, Date
						else {
							reply = "" + data;
						}

						return reply;
					} catch (err) {
						return (err.message ? err.message : "" + err);
					}
				}

				function indent(count, options) {
					var strarr = [];
					strarr.push(options.baseIndent);
					for (var i = 0; i < count; i++) {
						strarr.push(options.childIndent);
					}
					return strarr.join("");
				};

				return recursive(data, showLevels, 0, opt);
			};

			/**
			 * Setup a GMail style loading message.
			 * @see http://getahead.org/dwr/browser/util/useloadingmessage
			 */
			dwr.util.useLoadingMessage = function(message) {
				var loadingMessage;
				if (message) loadingMessage = message;
				else loadingMessage = "Loading";
				dwr.engine.setPreHook(function() {
					var disabledZone = dwr.util.byId('disabledZone');
					if (!disabledZone) {
						disabledZone = document.createElement('div');
						disabledZone.setAttribute('id', 'disabledZone');
						disabledZone.style.position = "absolute";
						disabledZone.style.zIndex = "1000";
						disabledZone.style.left = "0px";
						disabledZone.style.top = "0px";
						disabledZone.style.width = "100%";
						disabledZone.style.height = "100%";
						document.body.appendChild(disabledZone);
						var messageZone = document.createElement('div');
						messageZone.setAttribute('id', 'messageZone');
						messageZone.style.position = "absolute";
						messageZone.style.top = "0px";
						messageZone.style.right = "0px";
						messageZone.style.background = "red";
						messageZone.style.color = "white";
						messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";
						messageZone.style.padding = "4px";
						disabledZone.appendChild(messageZone);
						var text = document.createTextNode(loadingMessage);
						messageZone.appendChild(text);
						dwr.util._disabledZoneUseCount = 1;
					} else {
						dwr.util.byId('messageZone').innerHTML = loadingMessage;
						disabledZone.style.visibility = 'visible';
						dwr.util._disabledZoneUseCount++;
					}
				});
				dwr.engine.setPostHook(function() {
					dwr.util._disabledZoneUseCount--;
					if (dwr.util._disabledZoneUseCount == 0) {
						dwr.util.byId('disabledZone').style.visibility = 'hidden';
					}
				});
			};

			/**
			 * Set a global highlight handler
			 */
			dwr.util.setHighlightHandler = function(handler) {
				dwr.util._highlightHandler = handler;
			};

			/**
			 * An example highlight handler
			 */
			dwr.util.yellowFadeHighlightHandler = function(ele) {
				dwr.util._yellowFadeProcess(ele, 0);
			};
			dwr.util._yellowFadeSteps = ["d0", "b0", "a0", "90", "98", "a0", "a8", "b0", "b8", "c0", "c8", "d0", "d8", "e0", "e8", "f0", "f8"];
			dwr.util._yellowFadeProcess = function(ele, colorIndex) {
				ele = dwr.util.byId(ele);
				if (colorIndex < dwr.util._yellowFadeSteps.length) {
					ele.style.backgroundColor = "#ffff" + dwr.util._yellowFadeSteps[colorIndex];
					setTimeout("dwr.util._yellowFadeProcess('" + ele.id + "'," + (colorIndex + 1) + ")", 200);
				} else {
					ele.style.backgroundColor = "transparent";
				}
			};

			/**
			 * An example highlight handler
			 */
			dwr.util.borderFadeHighlightHandler = function(ele) {
				ele.style.borderWidth = "2px";
				ele.style.borderStyle = "solid";
				dwr.util._borderFadeProcess(ele, 0);
			};
			dwr.util._borderFadeSteps = ["d0", "b0", "a0", "90", "98", "a0", "a8", "b0", "b8", "c0", "c8", "d0", "d8", "e0", "e8", "f0", "f8"];
			dwr.util._borderFadeProcess = function(ele, colorIndex) {
				ele = dwr.util.byId(ele);
				if (colorIndex < dwr.util._borderFadeSteps.length) {
					ele.style.borderColor = "#ff" + dwr.util._borderFadeSteps[colorIndex] + dwr.util._borderFadeSteps[colorIndex];
					setTimeout("dwr.util._borderFadeProcess('" + ele.id + "'," + (colorIndex + 1) + ")", 200);
				} else {
					ele.style.backgroundColor = "transparent";
				}
			};

			/**
			 * A focus highlight handler
			 */
			dwr.util.focusHighlightHandler = function(ele) {
				try {
					ele.focus();
				} catch (ex) { /* ignore */ }
			};

			/** @private the current global highlight style */
			dwr.util._highlightHandler = null;

			/**
			 * Highlight that an element has changed
			 */
			dwr.util.highlight = function(ele, options) {
				if (options && options.highlightHandler) {
					options.highlightHandler(dwr.util.byId(ele));
				} else if (dwr.util._highlightHandler != null) {
					dwr.util._highlightHandler(dwr.util.byId(ele));
				}
			};

			/**
			 * Set the value an HTML element to the specified value.
			 * @see http://getahead.org/dwr/browser/util/setvalue
			 */
			dwr.util.setValue = function(ele, val, options) {
				if (val == null) val = "";
				if (options == null) options = {};

				var orig = ele;
				if (typeof ele == "string") {
					ele = dwr.util.byId(ele);
					// We can work with names and need to sometimes for radio buttons, and IE has
					// an annoying bug where getElementById() returns an element based on name if
					// it doesn't find it by id. Here we don't want to do that, so:
					if (ele && ele.id != orig) ele = null;
				}
				var nodes = null;
				if (ele == null) {
					// Now it is time to look by name
					nodes = document.getElementsByName(orig);
					if (nodes.length >= 1) ele = nodes.item(0);
				}

				if (ele == null) {
					dwr.util._debug("setValue() can't find an element with id/name: " + orig + ".");
					return;
				}

				// All paths now lead to some update so we highlight a change
				dwr.util.highlight(ele, options);

				if (dwr.util._isHTMLElement(ele, "select")) {
					if (ele.type == "select-multiple" && dwr.util._isArray(val)) dwr.util._selectListItems(ele, val);
					else dwr.util._selectListItem(ele, val);
					return;
				}

				if (dwr.util._isHTMLElement(ele, "input")) {
					if (ele.type == "radio" || ele.type == "checkbox") {
						if (nodes && nodes.length >= 1) {
							for (var i = 0; i < nodes.length; i++) {
								var node = nodes.item(i);
								if (node.type != ele.type) continue;
								if (dwr.util._isArray(val)) {
									node.checked = false;
									for (var j = 0; j < val.length; j++)
										if (val[j] == node.value) node.checked = true;
								} else {
									node.checked = (node.value == val);
								}
							}
						} else {
							ele.checked = (val == true);
						}
					} else ele.value = val;

					return;
				}

				if (dwr.util._isHTMLElement(ele, "textarea")) {
					ele.value = val;
					return;
				}

				// If the value to be set is a DOM object then we try importing the node
				// rather than serializing it out
				if (val.nodeType) {
					if (val.nodeType == 9 /*Node.DOCUMENT_NODE*/ ) val = val.documentElement;
					val = dwr.util._importNode(ele.ownerDocument, val, true);
					ele.appendChild(val);
					return;
				}

				// Fall back to innerHTML and friends
				if (dwr.util._shouldEscapeHtml(options) && typeof(val) == "string") {
					if (ele.textContent) ele.textContent = val;
					else if (ele.innerText) ele.innerText = val;
					else ele.innerHTML = dwr.util.escapeHtml(val);
				} else {
					ele.innerHTML = val;
				}
			};

			/**
			 * @private Find multiple items in a select list and select them. Used by setValue()
			 * @param ele The select list item
			 * @param val The array of values to select
			 */
			dwr.util._selectListItems = function(ele, val) {
				// We deal with select list elements by selecting the matching option
				// Begin by searching through the values
				var found = false;
				var i;
				var j;
				for (i = 0; i < ele.options.length; i++) {
					ele.options[i].selected = false;
					for (j = 0; j < val.length; j++) {
						if (ele.options[i].value == val[j]) {
							ele.options[i].selected = true;
						}
					}
				}
				// If that fails then try searching through the visible text
				if (found) return;

				for (i = 0; i < ele.options.length; i++) {
					for (j = 0; j < val.length; j++) {
						if (ele.options[i].text == val[j]) {
							ele.options[i].selected = true;
						}
					}
				}
			};

			/**
			 * @private Find an item in a select list and select it. Used by setValue()
			 * @param ele The select list item
			 * @param val The value to select
			 */
			dwr.util._selectListItem = function(ele, val) {
				// We deal with select list elements by selecting the matching option
				// Begin by searching through the values
				var found = false;
				var i;
				for (i = 0; i < ele.options.length; i++) {
					if (ele.options[i].value == val) {
						ele.options[i].selected = true;
						found = true;
					} else {
						ele.options[i].selected = false;
					}
				}

				// If that fails then try searching through the visible text
				if (found) return;

				for (i = 0; i < ele.options.length; i++) {
					ele.options[i].selected = (ele.options[i].text == val);
				}
			};

			/**
			 * Read the current value for a given HTML element.
			 * @see http://getahead.org/dwr/browser/util/getvalue
			 */
			dwr.util.getValue = function(ele, options) {
				if (options == null) options = {};
				var orig = ele;
				if (typeof ele == "string") {
					ele = dwr.util.byId(ele);
					// We can work with names and need to sometimes for radio buttons, and IE has
					// an annoying bug where getElementById() returns an element based on name if
					// it doesn't find it by id. Here we don't want to do that, so:
					if (ele && ele.id != orig) ele = null;
				}
				var nodes = null;
				if (ele == null) {
					// Now it is time to look by name
					nodes = document.getElementsByName(orig);
					if (nodes.length >= 1) ele = nodes.item(0);
				}
				if (ele == null) {
					dwr.util._debug("getValue() can't find an element with id/name: " + orig + ".");
					return "";
				}

				if (dwr.util._isHTMLElement(ele, "select")) {
					// Using "type" property instead of "multiple" as "type" is an official 
					// client-side property since JS 1.1
					if (ele.type == "select-multiple") {
						var reply = new Array();
						for (var i = 0; i < ele.options.length; i++) {
							var item = ele.options[i];
							if (item.selected) {
								var valueAttr = item.getAttributeNode("value");
								if (valueAttr && valueAttr.specified) {
									reply.push(item.value);
								} else {
									reply.push(item.text);
								}
							}
						}
						return reply;
					} else {
						var sel = ele.selectedIndex;
						if (sel != -1) {
							var item = ele.options[sel];
							var valueAttr = item.getAttributeNode("value");
							if (valueAttr && valueAttr.specified) {
								return item.value;
							}
							return item.text;
						} else {
							return "";
						}
					}
				}

				if (dwr.util._isHTMLElement(ele, "input")) {
					if (ele.type == "radio") {
						if (nodes && nodes.length >= 1) {
							for (var i = 0; i < nodes.length; i++) {
								var node = nodes.item(i);
								if (node.type == ele.type) {
									if (node.checked) return node.value;
								}
							}
						}
						return ele.checked;
					}
					if (ele.type == "checkbox") {
						if (nodes && nodes.length >= 1) {
							var reply = [];
							for (var i = 0; i < nodes.length; i++) {
								var node = nodes.item(i);
								if (node.type == ele.type) {
									if (node.checked) reply.push(node.value);
								}
							}
							return reply;
						}
						return ele.checked;
					}
					return ele.value;
				}

				if (dwr.util._isHTMLElement(ele, "textarea")) {
					return ele.value;
				}

				if (dwr.util._shouldEscapeHtml(options)) {
					if (ele.textContent) return ele.textContent;
					else if (ele.innerText) return ele.innerText;
				}
				return ele.innerHTML;
			};

			/**
			 * getText() is like getValue() except that it reads the text (and not the value) from select elements
			 * @see http://getahead.org/dwr/browser/util/gettext
			 */
			dwr.util.getText = function(ele) {
				ele = dwr.util._getElementById(ele, "getText()");
				if (ele == null) return null;
				if (!dwr.util._isHTMLElement(ele, "select")) {
					dwr.util._debug("getText() can only be used with select elements. Attempt to use: " + dwr.util._detailedTypeOf(ele) + " from  id: " + orig + ".");
					return "";
				}

				// This is a bit of a scam because it assumes single select
				// but I'm not sure how we should treat multi-select.
				var sel = ele.selectedIndex;
				if (sel != -1) {
					return ele.options[sel].text;
				} else {
					return "";
				}
			};

			/**
			 * Given a map, or a recursive structure consisting of arrays and maps, call 
			 * setValue() for all leaf entries and use intermediate levels to form nested
			 * element ids.
			 * @see http://getahead.org/dwr/browser/util/setvalues
			 */
			dwr.util.setValues = function(data, options) {
				var prefix = "";
				if (options && options.prefix) prefix = options.prefix;
				if (options && options.idPrefix) prefix = options.idPrefix;
				dwr.util._setValuesRecursive(data, prefix);
			};

			/**
			 * @private Recursive helper for setValues()
			 */
			dwr.util._setValuesRecursive = function(data, idpath) {
				// Array containing objects -> add "[n]" to prefix and make recursive call
				// for each item object
				if (dwr.util._isArray(data) && data.length > 0 && dwr.util._isObject(data[0])) {
					for (var i = 0; i < data.length; i++) {
						dwr.util._setValuesRecursive(data[i], idpath + "[" + i + "]");
					}
				}
				// Object (not array) -> handle nested object properties
				else if (dwr.util._isObject(data) && !dwr.util._isArray(data)) {
					for (var prop in data) {
						var subidpath = idpath ? idpath + "." + prop : prop;
						// Object (not array), or array containing objects -> call ourselves recursively
						if (dwr.util._isObject(data[prop]) && !dwr.util._isArray(data[prop]) || dwr.util._isArray(data[prop]) && data[prop].length > 0 && dwr.util._isObject(data[prop][0])) {
							dwr.util._setValuesRecursive(data[prop], subidpath);
						}
						// Functions -> skip
						else if (typeof data[prop] == "function") {
							// NOP
						}
						// Only simple values left (or array of simple values, or empty array)
						// -> call setValue()
						else {
							// Are there any elements with that id or name
							if (dwr.util.byId(subidpath) != null || document.getElementsByName(subidpath).length >= 1) {
								dwr.util.setValue(subidpath, data[prop]);
							}
						}
					}
				}
			};

			/**
			 * Given a map, or a recursive structure consisting of arrays and maps, call 
			 * getValue() for all leaf entries and use intermediate levels to form nested
			 * element ids.
			 * Given a string or element that refers to a form, create an object from the 
			 * elements of the form.
			 * @see http://getahead.org/dwr/browser/util/getvalues
			 */
			dwr.util.getValues = function(data, options) {
				if (typeof data == "string" || dwr.util._isHTMLElement(data)) {
					return dwr.util.getFormValues(data);
				} else {
					var prefix = "";
					if (options != null && options.prefix) prefix = options.prefix;
					if (options != null && options.idPrefix) prefix = options.idPrefix;
					dwr.util._getValuesRecursive(data, prefix);
					return data;
				}
			};

			/**
			 * Given a string or element that refers to a form, create an object from the 
			 * elements of the form.
			 * @see http://getahead.org/dwr/browser/util/getvalues
			 */
			dwr.util.getFormValues = function(eleOrNameOrId) {
				var ele = null;
				if (typeof eleOrNameOrId == "string") {
					ele = document.forms[eleOrNameOrId];
					if (ele == null) ele = dwr.util.byId(eleOrNameOrId);
				} else if (dwr.util._isHTMLElement(eleOrNameOrId)) {
					ele = eleOrNameOrId;
				}
				if (ele != null) {
					if (ele.elements == null) {
						alert("getFormValues() requires an object or reference to a form element.");
						return null;
					}
					var reply = {};
					var name;
					var value;
					for (var i = 0; i < ele.elements.length; i++) {
						if (ele[i].type in {
								button: 0,
								submit: 0,
								reset: 0,
								image: 0,
								file: 0
							}) continue;
						if (ele[i].name) {
							name = ele[i].name;
							value = dwr.util.getValue(name);
						} else {
							if (ele[i].id) name = ele[i].id;
							else name = "element" + i;
							value = dwr.util.getValue(ele[i]);
						}
						reply[name] = value;
					}
					return reply;
				}
			};

			/**
			 * @private Recursive helper for getValues().
			 */
			dwr.util._getValuesRecursive = function(data, idpath) {
				// Array containing objects -> add "[n]" to idpath and make recursive call
				// for each item object
				if (dwr.util._isArray(data) && data.length > 0 && dwr.util._isObject(data[0])) {
					for (var i = 0; i < data.length; i++) {
						dwr.util._getValuesRecursive(data[i], idpath + "[" + i + "]");
					}
				}
				// Object (not array) -> handle nested object properties
				else if (dwr.util._isObject(data) && !dwr.util._isArray(data)) {
					for (var prop in data) {
						var subidpath = idpath ? idpath + "." + prop : prop;
						// Object, or array containing objects -> call ourselves recursively
						if (dwr.util._isObject(data[prop]) && !dwr.util._isArray(data[prop]) || dwr.util._isArray(data[prop]) && data[prop].length > 0 && dwr.util._isObject(data[prop][0])) {
							dwr.util._getValuesRecursive(data[prop], subidpath);
						}
						// Functions -> skip
						else if (typeof data[prop] == "function") {
							// NOP
						}
						// Only simple values left (or array of simple values, or empty array)
						// -> call getValue()
						else {
							// Are there any elements with that id or name
							if (dwr.util.byId(subidpath) != null || document.getElementsByName(subidpath).length >= 1) {
								data[prop] = dwr.util.getValue(subidpath);
							}
						}
					}
				}
			};

			/**
			 * Add options to a list from an array or map.
			 * @see http://getahead.org/dwr/browser/lists
			 */
			dwr.util.addOptions = function(ele, data /*, options*/ ) {
				ele = dwr.util._getElementById(ele, "addOptions()");
				if (ele == null) return;
				var useOptions = dwr.util._isHTMLElement(ele, "select");
				var useLi = dwr.util._isHTMLElement(ele, ["ul", "ol"]);
				if (!useOptions && !useLi) {
					dwr.util._debug("addOptions() can only be used with select/ul/ol elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
					return;
				}
				if (data == null) return;

				var argcount = arguments.length;
				var options = {};
				var lastarg = arguments[argcount - 1];
				if (argcount > 2 && dwr.util._isObject(lastarg)) {
					options = lastarg;
					argcount--;
				}
				var arg3 = null;
				if (argcount >= 3) arg3 = arguments[2];
				var arg4 = null;
				if (argcount >= 4) arg4 = arguments[3];
				if (!options.optionCreator && useOptions) options.optionCreator = dwr.util._defaultOptionCreator;
				if (!options.optionCreator && useLi) options.optionCreator = dwr.util._defaultListItemCreator;

				var text, value, li;
				if (dwr.util._isArray(data)) {
					// Loop through the data that we do have
					for (var i = 0; i < data.length; i++) {
						options.data = data[i];
						options.text = null;
						options.value = null;
						if (useOptions) {
							if (arg3 != null) {
								if (arg4 != null) {
									options.text = dwr.util._getValueFrom(data[i], arg4);
									options.value = dwr.util._getValueFrom(data[i], arg3);
								} else options.text = options.value = dwr.util._getValueFrom(data[i], arg3);
							} else options.text = options.value = dwr.util._getValueFrom(data[i]);

							if (options.text != null || options.value) {
								var opt = options.optionCreator(options);
								opt.text = options.text;
								opt.value = options.value;
								ele.options[ele.options.length] = opt;
							}
						} else {
							options.value = dwr.util._getValueFrom(data[i], arg3);
							if (options.value != null) {
								li = options.optionCreator(options);
								if (dwr.util._shouldEscapeHtml(options)) {
									options.value = dwr.util.escapeHtml(options.value);
								}
								li.innerHTML = options.value;
								ele.appendChild(li);
							}
						}
					}
				} else if (arg4 != null) {
					if (!useOptions) {
						alert("dwr.util.addOptions can only create select lists from objects.");
						return;
					}
					for (var prop in data) {
						options.data = data[prop];
						options.value = dwr.util._getValueFrom(data[prop], arg3);
						options.text = dwr.util._getValueFrom(data[prop], arg4);

						if (options.text != null || options.value) {
							var opt = options.optionCreator(options);
							opt.text = options.text;
							opt.value = options.value;
							ele.options[ele.options.length] = opt;
						}
					}
				} else {
					if (!useOptions) {
						dwr.util._debug("dwr.util.addOptions can only create select lists from objects.");
						return;
					}
					for (var prop in data) {
						if (typeof data[prop] == "function") continue;
						options.data = data[prop];
						if (!arg3) {
							options.value = prop;
							options.text = data[prop];
						} else {
							options.value = data[prop];
							options.text = prop;
						}
						if (options.text != null || options.value) {
							var opt = options.optionCreator(options);
							opt.text = options.text;
							opt.value = options.value;
							ele.options[ele.options.length] = opt;
						}
					}
				}

				// All error routes through this function result in a return, so highlight now
				dwr.util.highlight(ele, options);
			};

			/**
			 * @private Get the data from an array function for dwr.util.addOptions
			 */
			dwr.util._getValueFrom = function(data, method) {
				if (method == null) return data;
				else if (typeof method == 'function') return method(data);
				else return data[method];
			};

			/**
			 * @private Default option creation function
			 */
			dwr.util._defaultOptionCreator = function(options) {
				return new Option();
			};

			/**
			 * @private Default list item creation function
			 */
			dwr.util._defaultListItemCreator = function(options) {
				return document.createElement("li");
			};

			/**
			 * Remove all the options from a select list (specified by id)
			 * @see http://getahead.org/dwr/browser/lists
			 */
			dwr.util.removeAllOptions = function(ele) {
				ele = dwr.util._getElementById(ele, "removeAllOptions()");
				if (ele == null) return;
				var useOptions = dwr.util._isHTMLElement(ele, "select");
				var useLi = dwr.util._isHTMLElement(ele, ["ul", "ol"]);
				if (!useOptions && !useLi) {
					dwr.util._debug("removeAllOptions() can only be used with select, ol and ul elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
					return;
				}
				if (useOptions) {
					ele.options.length = 0;
				} else {
					while (ele.childNodes.length > 0) {
						ele.removeChild(ele.firstChild);
					}
				}
			};

			/**
			 * Create rows inside a the table, tbody, thead or tfoot element (given by id).
			 * @see http://getahead.org/dwr/browser/tables
			 */
			dwr.util.addRows = function(ele, data, cellFuncs, options) {
				ele = dwr.util._getElementById(ele, "addRows()");
				if (ele == null) return;
				if (!dwr.util._isHTMLElement(ele, ["table", "tbody", "thead", "tfoot"])) {
					dwr.util._debug("addRows() can only be used with table, tbody, thead and tfoot elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
					return;
				}
				if (!options) options = {};
				if (!options.rowCreator) options.rowCreator = dwr.util._defaultRowCreator;
				if (!options.cellCreator) options.cellCreator = dwr.util._defaultCellCreator;
				var tr, rowNum;
				if (dwr.util._isArray(data)) {
					for (rowNum = 0; rowNum < data.length; rowNum++) {
						options.rowData = data[rowNum];
						options.rowIndex = rowNum;
						options.rowNum = rowNum;
						options.data = null;
						options.cellNum = -1;
						tr = dwr.util._addRowInner(cellFuncs, options);
						if (tr != null) ele.appendChild(tr);
					}
				} else if (typeof data == "object") {
					rowNum = 0;
					for (var rowIndex in data) {
						options.rowData = data[rowIndex];
						options.rowIndex = rowIndex;
						options.rowNum = rowNum;
						options.data = null;
						options.cellNum = -1;
						tr = dwr.util._addRowInner(cellFuncs, options);
						if (tr != null) ele.appendChild(tr);
						rowNum++;
					}
				}

				dwr.util.highlight(ele, options);
			};

			/**
			 * @private Internal function to draw a single row of a table.
			 */
			dwr.util._addRowInner = function(cellFuncs, options) {
				var tr = options.rowCreator(options);
				if (tr == null) return null;
				for (var cellNum = 0; cellNum < cellFuncs.length; cellNum++) {
					var func = cellFuncs[cellNum];
					if (typeof func == 'function') options.data = func(options.rowData, options);
					else options.data = func || "";
					options.cellNum = cellNum;
					var td = options.cellCreator(options);
					if (td != null) {
						if (options.data != null) {
							if (dwr.util._isHTMLElement(options.data)) td.appendChild(options.data);
							else {
								if (dwr.util._shouldEscapeHtml(options) && typeof(options.data) == "string") {
									td.innerHTML = dwr.util.escapeHtml(options.data);
								} else {
									td.innerHTML = options.data;
								}
							}
						}
						tr.appendChild(td);
					}
				}
				return tr;
			};

			/**
			 * @private Default row creation function
			 */
			dwr.util._defaultRowCreator = function(options) {
				return document.createElement("tr");
			};

			/**
			 * @private Default cell creation function
			 */
			dwr.util._defaultCellCreator = function(options) {
				return document.createElement("td");
			};

			/**
			 * Remove all the children of a given node.
			 * @see http://getahead.org/dwr/browser/tables
			 */
			dwr.util.removeAllRows = function(ele, options) {
				ele = dwr.util._getElementById(ele, "removeAllRows()");
				if (ele == null) return;
				if (!options) options = {};
				if (!options.filter) options.filter = function() {
					return true;
				};
				if (!dwr.util._isHTMLElement(ele, ["table", "tbody", "thead", "tfoot"])) {
					dwr.util._debug("removeAllRows() can only be used with table, tbody, thead and tfoot elements. Attempt to use: " + dwr.util._detailedTypeOf(ele));
					return;
				}
				var child = ele.firstChild;
				var next;
				while (child != null) {
					next = child.nextSibling;
					if (options.filter(child)) {
						ele.removeChild(child);
					}
					child = next;
				}
			};

			/**
			 * dwr.util.byId(ele).className = "X", that we can call from Java easily.
			 */
			dwr.util.setClassName = function(ele, className) {
				ele = dwr.util._getElementById(ele, "setClassName()");
				if (ele == null) return;
				ele.className = className;
			};

			/**
			 * dwr.util.byId(ele).className += "X", that we can call from Java easily.
			 */
			dwr.util.addClassName = function(ele, className) {
				ele = dwr.util._getElementById(ele, "addClassName()");
				if (ele == null) return;
				ele.className += " " + className;
			};

			/**
			 * dwr.util.byId(ele).className -= "X", that we can call from Java easily
			 * From code originally by Gavin Kistner
			 */
			dwr.util.removeClassName = function(ele, className) {
				ele = dwr.util._getElementById(ele, "removeClassName()");
				if (ele == null) return;
				var regex = new RegExp("(^|\\s)" + className + "(\\s|$)", 'g');
				ele.className = ele.className.replace(regex, '');
			};

			/**
			 * dwr.util.byId(ele).className |= "X", that we can call from Java easily.
			 */
			dwr.util.toggleClassName = function(ele, className) {
				ele = dwr.util._getElementById(ele, "toggleClassName()");
				if (ele == null) return;
				var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
				if (regex.test(ele.className)) {
					ele.className = ele.className.replace(regex, '');
				} else {
					ele.className += " " + className;
				}
			};

			/**
			 * Clone a node and insert it into the document just above the 'template' node
			 * @see http://getahead.org/dwr/???
			 */
			dwr.util.cloneNode = function(ele, options) {
				ele = dwr.util._getElementById(ele, "cloneNode()");
				if (ele == null) return null;
				if (options == null) options = {};
				var clone = ele.cloneNode(true);
				if (options.idPrefix || options.idSuffix) {
					dwr.util._updateIds(clone, options);
				} else {
					dwr.util._removeIds(clone);
				}
				ele.parentNode.insertBefore(clone, ele);
				return clone;
			};

			/**
			 * @private Update all of the ids in an element tree
			 */
			dwr.util._updateIds = function(ele, options) {
				if (options == null) options = {};
				if (ele.id) {
					ele.setAttribute("id", (options.idPrefix || "") + ele.id + (options.idSuffix || ""));
				}
				var children = ele.childNodes;
				for (var i = 0; i < children.length; i++) {
					var child = children.item(i);
					if (child.nodeType == 1 /*Node.ELEMENT_NODE*/ ) {
						dwr.util._updateIds(child, options);
					}
				}
			};

			/**
			 * @private Remove all the Ids from an element
			 */
			dwr.util._removeIds = function(ele) {
				if (ele.id) ele.removeAttribute("id");
				var children = ele.childNodes;
				for (var i = 0; i < children.length; i++) {
					var child = children.item(i);
					if (child.nodeType == 1 /*Node.ELEMENT_NODE*/ ) {
						dwr.util._removeIds(child);
					}
				}
			};

			/**
			 * Clone a template node and its embedded template child nodes according to
			 * cardinalities (of arrays) in supplied data.  
			 */
			dwr.util.cloneNodeForValues = function(templateEle, data, options) {
				templateEle = dwr.util._getElementById(templateEle, "cloneNodeForValues()");
				if (templateEle == null) return null;
				if (options == null) options = {};
				var idpath;
				if (options.idPrefix != null)
					idpath = options.idPrefix;
				else
					idpath = templateEle.id || "";
				return dwr.util._cloneNodeForValuesRecursive(templateEle, data, idpath, options);
			};

			/**
			 * @private Recursive helper for cloneNodeForValues(). 
			 */
			dwr.util._cloneNodeForValuesRecursive = function(templateEle, data, idpath, options) {
				// Incoming array -> make an id for each item and call clone of the template 
				// for each of them
				if (dwr.util._isArray(data)) {
					var clones = [];
					for (var i = 0; i < data.length; i++) {
						var item = data[i];
						var clone = dwr.util._cloneNodeForValuesRecursive(templateEle, item, idpath + "[" + i + "]", options);
						clones.push(clone);
					}
					return clones;
				} else
				// Incoming object (not array) -> clone the template, add id prefixes, add 
				// clone to DOM, and then recurse into any array properties if they contain 
				// objects and there is a suitable template
				if (dwr.util._isObject(data) && !dwr.util._isArray(data)) {
					var clone = templateEle.cloneNode(true);
					if (options.updateCloneStyle && clone.style) {
						for (var propname in options.updateCloneStyle) {
							clone.style[propname] = options.updateCloneStyle[propname];
						}
					}
					dwr.util._replaceIds(clone, templateEle.id, idpath);
					templateEle.parentNode.insertBefore(clone, templateEle);
					dwr.util._cloneSubArrays(data, idpath, options);
					return clone;
				}

				// It is an error to end up here so we return nothing
				return null;
			};

			/**
			 * @private Substitute a leading idpath fragment with another idpath for all 
			 * element ids tree, and remove ids that don't match the idpath. 
			 */
			dwr.util._replaceIds = function(ele, oldidpath, newidpath) {
				if (ele.id) {
					var newId = null;
					if (ele.id == oldidpath) {
						newId = newidpath;
					} else if (ele.id.length > oldidpath.length) {
						if (ele.id.substr(0, oldidpath.length) == oldidpath) {
							var trailingChar = ele.id.charAt(oldidpath.length);
							if (trailingChar == "." || trailingChar == "[") {
								newId = newidpath + ele.id.substr(oldidpath.length);
							}
						}
					}
					if (newId) {
						ele.setAttribute("id", newId);
					} else {
						ele.removeAttribute("id");
					}
				}
				var children = ele.childNodes;
				for (var i = 0; i < children.length; i++) {
					var child = children.item(i);
					if (child.nodeType == 1 /*Node.ELEMENT_NODE*/ ) {
						dwr.util._replaceIds(child, oldidpath, newidpath);
					}
				}
			};

			/**
			 * @private Finds arrays in supplied data and uses any corresponding template 
			 * node to make a clone for each item in the array. 
			 */
			dwr.util._cloneSubArrays = function(data, idpath, options) {
				for (prop in data) {
					var value = data[prop];
					// Look for potential recursive cloning in all array properties
					if (dwr.util._isArray(value)) {
						// Only arrays with objects are interesting for cloning
						if (value.length > 0 && dwr.util._isObject(value[0])) {
							var subTemplateId = idpath + "." + prop;
							var subTemplateEle = dwr.util.byId(subTemplateId);
							if (subTemplateEle != null) {
								dwr.util._cloneNodeForValuesRecursive(subTemplateEle, value, subTemplateId, options);
							}
						}
					}
					// Continue looking for arrays in object properties
					else if (dwr.util._isObject(value)) {
						dwr.util._cloneSubArrays(value, idpath + "." + prop, options);
					}
				}
			};

			/**
			 * @private Helper to turn a string into an element with an error message
			 */
			dwr.util._getElementById = function(ele, source) {
				var orig = ele;
				ele = dwr.util.byId(ele);
				if (ele == null) {
					dwr.util._debug(source + " can't find an element with id: " + orig + ".");
				}
				return ele;
			};

			/**
			 * @private Is the given node an HTML element (optionally of a given type)?
			 * @param ele The element to test
			 * @param nodeName eg "input", "textarea" - check for node name (optional)
			 *         if nodeName is an array then check all for a match.
			 */
			dwr.util._isHTMLElement = function(ele, nodeName) {
				if (ele == null || typeof ele != "object" || ele.nodeName == null) {
					return false;
				}
				if (nodeName != null) {
					var test = ele.nodeName.toLowerCase();
					if (typeof nodeName == "string") {
						return test == nodeName.toLowerCase();
					}
					if (dwr.util._isArray(nodeName)) {
						var match = false;
						for (var i = 0; i < nodeName.length && !match; i++) {
							if (test == nodeName[i].toLowerCase()) {
								match = true;
							}
						}
						return match;
					}
					dwr.util._debug("dwr.util._isHTMLElement was passed test node name that is neither a string or array of strings");
					return false;
				}
				return true;
			};

			/**
			 * @private Like typeOf except that more information for an object is returned other than "object"
			 */
			dwr.util._detailedTypeOf = function(x) {
				var reply = typeof x;
				if (reply == "object") {
					reply = Object.prototype.toString.apply(x); // Returns "[object class]"
					reply = reply.substring(8, reply.length - 1); // Just get the class bit
				}
				return reply;
			};

			/**
			 * @private Object detector. Excluding null from objects.
			 */
			dwr.util._isObject = function(data) {
				return (data && typeof data == "object");
			};

			/**
			 * @private Array detector. Note: instanceof doesn't work with multiple frames.
			 */
			dwr.util._isArray = function(data) {
				return (data && data.join);
			};

			/**
			 * @private Date detector. Note: instanceof doesn't work with multiple frames.
			 */
			dwr.util._isDate = function(data) {
				return (data && data.toUTCString) ? true : false;
			};

			/**
			 * @private Used by setValue. Gets around the missing functionallity in IE.
			 */
			dwr.util._importNode = function(doc, importedNode, deep) {
				var newNode;

				if (importedNode.nodeType == 1 /*Node.ELEMENT_NODE*/ ) {
					newNode = doc.createElement(importedNode.nodeName);

					for (var i = 0; i < importedNode.attributes.length; i++) {
						var attr = importedNode.attributes[i];
						if (attr.nodeValue != null && attr.nodeValue != '') {
							newNode.setAttribute(attr.name, attr.nodeValue);
						}
					}

					if (typeof importedNode.style != "undefined") {
						newNode.style.cssText = importedNode.style.cssText;
					}
				} else if (importedNode.nodeType == 3 /*Node.TEXT_NODE*/ ) {
					newNode = doc.createTextNode(importedNode.nodeValue);
				}

				if (deep && importedNode.hasChildNodes()) {
					for (i = 0; i < importedNode.childNodes.length; i++) {
						newNode.appendChild(dwr.util._importNode(doc, importedNode.childNodes[i], true));
					}
				}

				return newNode;
			};

			/** @private Used internally when some message needs to get to the programmer */
			dwr.util._debug = function(message, stacktrace) {
				var written = false;
				try {
					if (window.console) {
						if (stacktrace && window.console.trace) window.console.trace();
						window.console.log(message);
						written = true;
					} else if (window.opera && window.opera.postError) {
						window.opera.postError(message);
						written = true;
					}
				} catch (ex) { /* ignore */ }

				if (!written) {
					var debug = document.getElementById("dwr-debug");
					if (debug) {
						var contents = message + "<br/>" + debug.innerHTML;
						if (contents.length > 2048) contents = contents.substring(0, 2048);
						debug.innerHTML = contents;
					}
				}
			};
		</script>
		<script src="js/String2MD5.js" type="text/javascript">
			< html >
				< head > < title > 404 Not Found < /title></head >
				< body >
				< h1 > 404 Not Found < /h1> / js / String2MD5.js was not found on this server. < p / > < hr / >
				< small >
				Resin - 3.0 .27(built Mon, 19 Jan 2009 01: 26: 35 PST) < /small> < /body></html >
		</script>
		<script type="text/javascript">
			function login() {
				if (document.loginForm.zjh.value == "") {
					alert("请输入您的帐号");
					document.loginForm.zjh.focus();
					return;
				}
				if (document.loginForm.mm.value == "") {
					alert("请输入您的密码");
					document.loginForm.mm.focus();
					return;
				}
				if (document.loginForm.v_yzm.value == "") {
					alert("请输入验证码");
					document.loginForm.v_yzm.focus();
					return;
				}
				//$("mm").value = MD5($("mm").value);
				document.loginForm.submit();
			}

			function findPassword() {
				var swidth = "550";
				var sheight = "350";
				var url = "/findPasswordAction.do?oper=infor";
				var sValue = window.showModalDialog(url, window,
					"dialogWidth:" + swidth + "px;dialogHeight:" + sheight + "px;help:no;status:no");
				//window.open(url);
			}

			function sendEmail() {
				document.loginForm.action = "/findPasswordAction.do?oper=findPassword";
				document.loginForm.submit();
			}

			function checkEmail() {
				var zjh = $('zjh1').value;
				var tips = $('evalue').value;
				var lx = $('lx').value;
				DWREngine.setAsync("false");
				ajaxtool.checkEmail(zjh, lx, tips, callback);
			}

			function callback(data) {
				document.getElementById("eflag").value = data;
			}

			function m_changeOne() {
				document.getElementById("vchart").src = "/validateCodeAction.do?random=" + Math.random();

			}

			function valiCode() {
				document.getElementById("vchart").src = "/validateCodeAction.do?random=" + Math.random();
			}
		</script>
	</head>
	<link rel="stylesheet" href="css/URPLOGIN.css" />

	<body marginwidth="0" marginheight="0" onload="valiCode()" style="overflow: auto;" topmargin="0" leftmargin="0">
		<table width="100%" height="100%" cellspacing="0" cellpadding="0" border="0" style="margin-top: 150px;">
			<tbody>
				<tr>
					<td align="center">
						<table width="525" cellspacing="0" cellpadding="0" border="0" background="img/pic/login/bg-top.jpg" >
							<tbody>
								<tr>
									<td width="107">
										<img width="107" height="39" src="img/pic/login/top-left.jpg">
									</td>
									<td class="adtitle" width="256"> 提供全新教务管理方案 </td>
									<td class="adtitle" width="221"> </td>
									<td width="147" valign="bottom" align="right"> </td>
									<td aligh="right">
										<img width="135" height="39" src="img/pic/login/top-rightnew.jpg">
									</td>
									<td width="10">
										<img width="15" height="39" src="img/pic/login/top-right.jpg">
									</td>
								</tr>
							</tbody>
						</table>
						<table cellspacing="0" cellpadding="0" border="0">
							<tbody>
								<tr>
									<td class="linelogin"></td>
								</tr>
							</tbody>
						</table>
						<table class="mainbox" cellspacing="0" cellpadding="0" border="0">
							<tbody>
								<tr>
									<td width="33"> </td>
									<td width="352" valign="top">
										<form onsubmit="return login();" action="/loginAction.do" name="loginForm" method="post">
											<input type="hidden" name="zjh1">
											<input type="hidden" name="tips">
											<input type="hidden" name="lx">
											<input type="hidden" name="evalue">
											<input type="hidden" name="eflag">
											<input type="hidden" name="fs">
											<input type="hidden" name="dzslh">
											<table width="100%" cellspacing="0" cellpadding="0" border="0">
												<tbody>
													<tr>
														<td>
															<table width="100%" cellspacing="20" cellpadding="0" border="0">
																<tbody>
																	<tr>
																		<td class="font12" valign="bottom" height="60">
																			<table width="100%" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																					<tr>
																						<td class="font11"> </td>
																					</tr>
																					<tr>
																						<td id="welcomeMessage" class="font12">
																							<span id="welcomeMessage">欢迎来到URP综合教务系统，请输入您的帐号和密码</span>
																						</td>
																					</tr>
																				</tbody>
																			</table>
																		</td>
																	</tr>
																</tbody>
															</table>
														</td>
													</tr>
													<tr>
														<td>
															<table class="font-b" width="100%" cellspacing="6" cellpadding="0" border="0">
																<tbody>
																	<tr>
																		<td width="67" align="right">
																			<span id="userName_label">帐号</span> :
																		</td>
																		<td colspan="2">
																			<input class="input01" type="text" alt="notnull" title="帐号" value="" name="zjh">
																		</td>
																	</tr>
																	<tr>
																		<td width="67" align="right">
																			<span id="password_label">密码</span> :
																		</td>
																		<td colspan="2">
																			<input class="input01" type="password" alt="notnull" title="密码" value="" name="mm">
																		</td>
																	</tr>
																	<tr>
																		<td width="67" align="right">
																			<span id="password_label">验证码</span> :
																		</td>
																		<td align="left" colspan="2">
																			<input type="text" alt="notnull" title="验证码" size="4" name="v_yzm">
																			<img id="vchart" width="80" height="20" src="img/validateCodeAction.do.jpg">
																			<a ><!--onclick="m_changeOne();" href=""-->看不清，换一张</a>
																		</td>
																	</tr>
																</tbody>
															</table>
														</td>
													</tr>
													<tr>
														<td align="center">
															<table width="250" cellspacing="8" cellpadding="0" border="0">
																<tbody>
																	<tr>
																		<td align="right">
																			<input id="btnSure" class="buttonImg" type="image" border="0" title="登录" onclick="login(); return false;" src="img/zh/login.gif" name="">
																		</td>
																		<td align="center">
																			<input class="buttonImg" type="image" border="0" title="重设" onclick="reset(); return false" src="img/zh/reset.gif" name="">
																		</td>
																	</tr>
																</tbody>
															</table>
														</td>
													</tr>
												</tbody>
											</table>
										</form>
									</td>
									<td width="138" valign="bottom" align="right">
										<img width="138" height="103" src="img/pic/login/stamp.jpg">
									</td>
								</tr>
							</tbody>
						</table>
						<table width="525" cellspacing="0" cellpadding="0" border="0">
							<tbody>
								<tr>
									<td width="20">
										<img width="20" height="27" src="img/pic/login/bottom-left.jpg">
									</td>
									<td class="bottom" width="490"> 版权所有 © 北京清元优软科技有限公司 保留所有权利。 </td>
									<td width="15">
										<img width="15" height="27" src="img/pic/login/bottom-right.jpg">
									</td>
								</tr>
							</tbody>
						</table>
					</td>
				</tr>
			</tbody>
		</table>
	</body>

</html>